/* 
    webpack中多页面入口entry与HtmlWebpackPlugin的自动生成器，
    采用node读写磁盘文件进行逻辑处理并自动生成相关数据
 */

// 导入path与fs模块
const path = require("path")
const fs = require("fs")

// js文件路径和html页面路径
const jsPath = path.join(__dirname, "../src/js/")
const pagesPath = path.resolve(__dirname, "../src/pages/")

/**
 * 导入自动生成HTMl文件的插件,这个插件的两个作用：
 *   1. 自动在内存中根据指定页面生成一个内存的页面
 *   2. 自动把打包好的 main.js追加到页面中去
 */
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { entry } = require("../webpack.config")

/**
 * 获取目录（含子目录）下的所有文件
 * @param {*} path  路径名称 
 * @param {*} result  结果 
 * @returns 
 */
function getAllFiles(dirPath, result = []) {
    const files = fs.readdirSync(dirPath, { withFileTypes: true })
    files.forEach(file => {
        const filePath = path.join(dirPath, file.name)
        if(file.isDirectory()) {
            getAllFiles(filePath, result)
        } else {
            result.push(file)
        }
    });
    return result
}

/**
 * 生成多HtmlWebpackPlugin
 * @param {*} indexPath  首页入口文件 
 * @returns 
 */
function generateEntries(indexPath) {

    // 同步读取磁盘下的js文件夹
    let jsFiles = getAllFiles(jsPath)
    // 初始化entries映射对象
    entries = indexPath ? { index: indexPath } : {};
    // 过滤非js的文件
    return jsFiles.filter(file => {
        // 通过path模块的获取文件后缀，来对比是否是js文件，注意这里要忽略大小写
        // return file.isFile && file.extname(file.name).toLowerCase() === '.js' 
        // 当然也可以用正则来判断
        return file.isFile && /\.js$/i.test(file.name)
    }).reduce((result, file) => {
        let fnPath = path.join(file.path, file.name)
        let [filename] =  fnPath.replace(jsPath, "").split(".")
        result[filename] = fnPath
        return result;
    }, entries)

}


/**
 * 生成多Html
 * @returns 
 */
function generateHtmlWebpackPlugins(entries) {
    // 添加后缀名
    let htmls = Object.keys(entries).map(key => `${key}.html`)
    return htmls.filter(filename => fs.existsSync(path.join(pagesPath, filename))).map(filename => 
        new HtmlWebpackPlugin({
            // 指定 模板页面，将来会根据指定的页面路径，去生成内存中的页面,自动引入js
            template: path.resolve(pagesPath, filename),
            filename,
            chunks: [filename.split('.')[0]]
        })
    )
}


// 导出当前两个模块
module.exports = {
    generateEntries, generateHtmlWebpackPlugins
}